#!/usr/bin/env ruby


# risseStaticString.txt から定義を生成する

errorcount = 0
defs = []


# words.txt を開いて処理をする
linecount = 0
File.open(ARGV[1]).readlines.each do |line|
	linecount += 1
	# コメントの除去
	line.gsub!(/^#####.*/, '')
	# 空白のみになったらその行は処理しない
	next if line =~ /^\s*$/
	# 行の分解
	sp = line.split(/\s+/)
	# 単語マッチを行う物のみを抽出
	if sp[3] == 'true'
		defs << { :id => 'ss_' + sp[0], :string => sp[0], :def_comment => "トークンの値 #{sp[0]}" }
	end
end

# 入力ファイルを開いて一行ずつ処理をする
linecount = 0
File.open(ARGV[0]).readlines.each do |line|
	linecount += 1
	# コメントの除去
	line.gsub!(/\/\/.*/, '')
	# 空白のみになったらその行は処理しない
	next if line =~ /^\s*$/
	# 定義コメントの取り出し
	defcomment = ''
	line.gsub!(/\#!<(.*)/) { defcomment=$1; '' }
	# 行先頭と最後の空白の除去
	line.gsub!(/^\s+/, '')
	line.gsub!(/\s+$/, '')
	# パターンに従って分岐
	if line =~ /(\w+)\s+([^\s]+)$/
		# defs
		defs << { :id => $1, :string => $2, :def_comment => defcomment }
	else
		STDERR.puts "Unrecognized definition at line #{linecount}\n"
		errorcount += 1
	end

end
exit if errorcount != 0

#-----------------------------------------------------------------------

File.open(ARGV[2], "w") do |file|
	# ヘッダを書き出す
file.puts <<EOS
// generated by tools/static_strings.rb
// do not edit this file by hand

EOS

	# static string への実体の externとエイリアスを書き出す
	defs.each_index do |index|
		item = defs[index]
		file.puts("extern const tStringData &data_#{item[:id]};")
		file.puts("static const tString & #{item[:id]} = "+
			"*reinterpret_cast<const tString *>(&data_#{item[:id]});"+
			" //!< (static string) #{item[:def_comment]}")
	end
end

#-----------------------------------------------------------------------


File.open(ARGV[3], "w") do |file|
	# ヘッダを書き出す
file.puts <<EOS
// generated by tools/static_strings.rb
// do not edit this file by hand

EOS

	# static strings の tString ストレージを書き出す
	offset = 0
	file.puts "// static strings の文字列領域"
	file.puts "// この領域は tString の文字列ポインタが指す先と"
	file.puts "// 同じレイアウトになっている"
	file.puts "// ヘッダ側に tSS の実装(長ったらしいテンプレート)"
	file.puts "// を見せたくなかったので、ヘッダとして提供する側には"
	file.puts "// tSS<> を使っていない"

	defs.each_index do |index|
		item = defs[index]
		name = item[:string]

		item = defs[index]
		name = item[:string]
		file.print "const tStringData &data_#{item[:id]} = "
		file.print "tSS<"
		chars = ''
		name.each_byte do |byte|
			chars << ',' if chars != ''
			chars << "#{byte.chr.dump.gsub(/^"/,"'").gsub(/"$/,"'")}"
		end
		file.print chars
		file.print ">::data;"
		file.puts " /* #{item[:def_comment]} */"
	end

	file.print "\n\n"
end

#-----------------------------------------------------------------------


# 終了する
exit 0
